36 #include "sensor_io_i2c.h" 37 #include "sensor_drv.h" 40 #define FXLS8952_COUNTSPERG 512 41 #define FXLS8952_ACCEL_FIFO_SIZE 32 46 const registerreadlist_t FXLS8952_WHO_AM_I_READ[] =
48 { .readFrom = FXLS8952_WHO_AM_I, .numBytes = 1 }, __END_READ_DATA__
52 const registerreadlist_t FXLS8952_BUF_STATUS_READ[] =
54 { .readFrom = FXLS8952_BUF_STATUS, .numBytes = 1 }, __END_READ_DATA__
58 registerreadlist_t FXLS8952_DATA_READ[] =
60 { .readFrom = FXLS8952_BUF_X_LSB, .numBytes = 6 }, __END_READ_DATA__
64 const registerwritelist_t FXLS8952_Initialization[] =
69 { FXLS8952_SENS_CONFIG1, 0x00, 0x00 },
79 { FXLS8952_BUF_CONFIG1, 0x20, 0x00 },
88 { FXLS8952_SENS_CONFIG2, 0x50, 0x00 },
105 #if (ACCEL_ODR_HZ <= 1) // select 0.781Hz ODR 106 { FXLS8952_SENS_CONFIG3, 0xC0, 0x00 },
107 #elif (ACCEL_ODR_HZ <= 2) // select 1.5625Hz ODR 108 { FXLS8952_SENS_CONFIG3, 0x80, 0x00 },
109 #elif (ACCEL_ODR_HZ <= 3) // select 3.125Hz ODR 110 { FXLS8952_SENS_CONFIG3, 0xA0, 0x00 },
111 #elif (ACCEL_ODR_HZ <= 6) // select 6.25Hz ODR 112 { FXLS8952_SENS_CONFIG3, 0x90, 0x00 },
113 #elif (ACCEL_ODR_HZ <= 12) // select 12.5Hz ODR 114 { FXLS8952_SENS_CONFIG3, 0x80, 0x00 },
115 #elif (ACCEL_ODR_HZ <= 25) // select 25Hz ODR 116 { FXLS8952_SENS_CONFIG3, 0x70, 0x00 },
117 #elif (ACCEL_ODR_HZ <= 50) // select 50Hz ODR 118 { FXLS8952_SENS_CONFIG3, 0x60, 0x00 },
119 #elif (ACCEL_ODR_HZ <= 100) // select 100Hz ODR 120 { FXLS8952_SENS_CONFIG3, 0x50, 0x00 },
121 #elif (ACCEL_ODR_HZ <= 200) // select 200Hz ODR 122 { FXLS8952_SENS_CONFIG3, 0x40, 0x00 },
123 #elif (ACCEL_ODR_HZ <= 400) // select 400Hz ODR 124 { FXLS8952_SENS_CONFIG3, 0x30, 0x00 },
125 #elif (ACCEL_ODR_HZ <= 800) // select 800Hz ODR 126 { FXLS8952_SENS_CONFIG3, 0x20, 0x00 },
127 #elif (ACCEL_ODR_HZ <= 1600) // select 1600Hz ODR 128 { FXLS8952_SENS_CONFIG3, 0x10, 0x00 },
129 #else // select 3200Hz ODR 130 { FXLS8952_SENS_CONFIG3, 0x00, 0x00 },
140 { FXLS8952_SENS_CONFIG1, 0x03, 0x00 },
153 status = Register_I2C_Read(sensor->
bus_driver, sensor->
addr, FXLS8952_WHO_AM_I, 1, ®);
154 if (status==SENSOR_ERROR_NONE) {
155 if (reg==FXLS8952_WHOAMI_VALUE) {
156 sfg->Accel.iWhoAmI = reg;
158 return(SENSOR_ERROR_INIT);
166 status = Sensor_I2C_Write(sensor->
bus_driver, sensor->
addr, FXLS8952_Initialization );
174 sfg->Accel.isEnabled =
true;
184 uint8_t sensor_fifo_count = 1;
189 return SENSOR_ERROR_INIT;
193 status = Sensor_I2C_Read(sensor->
bus_driver, sensor->
addr, FXLS8952_BUF_STATUS_READ, I2C_Buffer );
194 if (status==SENSOR_ERROR_NONE) {
195 sensor_fifo_count = I2C_Buffer[0] & 0x3F;
198 if (sensor_fifo_count == 0)
return status;
203 FXLS8952_DATA_READ[0].numBytes = 6 * sensor_fifo_count;
204 status = Sensor_I2C_Read(sensor->
bus_driver, sensor->
addr, FXLS8952_DATA_READ, I2C_Buffer );
206 if (status==SENSOR_ERROR_NONE) {
208 for (j = 0; j < sensor_fifo_count; j++)
211 sample[
CHX] = (I2C_Buffer[6 * j + 1] << 8) | I2C_Buffer[6 * j + 0];
212 sample[
CHY] = (I2C_Buffer[6 * j + 3] << 8) | I2C_Buffer[6 * j + 2];
213 sample[
CHZ] = (I2C_Buffer[6 * j + 5] << 8) | I2C_Buffer[6 * j + 4];
224 const registerwritelist_t FXLS8952_IDLE[] =
227 { FXLS8952_SENS_CONFIG1, 0x00, 0x01 },
236 status = Sensor_I2C_Write(sensor->
bus_driver, sensor->
addr, FXLS8952_IDLE );
238 sfg->Accel.isEnabled =
false;
240 return SENSOR_ERROR_INIT;
244 #endif // if F_USING_ACCEL int8_t FXLS8952_Read(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
#define CHY
Used to access Y-channel entries in various data data structures.
void addToFifo(FifoSensor *sensor, uint16_t maxFifoSize, int16_t sample[3])
addToFifo is called from within sensor driver read functions
The top level fusion structure.
void * bus_driver
should be of type (ARM_DRIVER_I2C* for I2C-based sensors, ARM_DRIVER_SPI* for SPI) ...
#define ACCEL_FIFO_SIZE
FXOS8700 (accel), MMA8652, FXLS8952 all have 32 element FIFO.
The FifoSensor union allows us to use common pointers for Accel, Mag & Gyro logical sensor structures...
The sensor_fusion.h file implements the top level programming interface.
#define FXLS8952_COUNTSPERG
Provides function prototypes for driver level interfaces.
int8_t FXLS8952_Idle(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
#define FXLS8952_ACCEL_FIFO_SIZE
#define CHX
Used to access X-channel entries in various data data structures.
int8_t FXLS8952_Init(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
void conditionSample(int16_t sample[3])
conditionSample ensures that we never encounter the maximum negative two's complement value for a 16-...
An instance of PhysicalSensor structure type should be allocated for each physical sensors (combo dev...
uint16_t isInitialized
Bitfields to indicate sensor is active (use SensorBitFields from build.h)
#define F_USING_ACCEL
nominally 0x0001 if an accelerometer is to be used, 0x0000 otherwise
SensorFusionGlobals sfg
This is the primary sensor fusion data structure.
uint16_t addr
I2C address if applicable.